(() => {
  // class 中的修饰符
  // 类的修饰符---类中的成员的可访问性
  // 类中的成员的默认修饰为public

  // public修饰符，类中成员默认的修饰符，代表是公众的，任何位置都可以访问类中的属性与方法
  // private修饰符，被private修饰的属性或者方法，外部是无法访问的，子类中也无法访问该成员属性
  // protect修饰符，被protect修饰的属性或者方法，外部是无法访问的，但是在派生类中可以访问



  class Animal {
    public name: string
    private food: string
    protected lag: number
    constructor(name: string, food: string, lag: number) {
      this.name = name
      this.food = food
      this.lag = lag
    }
    eat() {
      console.log(`我是${this.name}，我吃${this.food},我有${this.lag}条腿`)
    }
  }

  const dog = new Animal('狗', '肉', 4)


  console.log(dog.name)
  // console.log(dog.food)////私有属性和方法，外部无法访问
  // console.log(dog.lag)//受保护的成员外部不可以被访问

  dog.eat()

  // 定义一个字类
  class Cat extends Animal {
    constructor(name: string, food: string, lag: number) {
      super(name, food, lag)
    }

    eat(): void {
      // console.log(`我是${this.name}，我吃${this.food},我有${this.lag}条腿`)
      console.log(`我是${this.name},我有${this.lag}条腿`)
    }
  }

  const cat = new Cat('猫', '鱼', 4)

  console.log(cat.name)
  // console.log(cat.food)
  // console.log(cat.lag)

})()